/* 组合计数
    递推法，隔板法，乘法原理，加法原理，组合数，排列数，Lucas，Catalan数列

* 1.求组合数
    (1)递推 O(n^2) C(a,b) = C(a-1,b) + C(a-1,b-1)
    int c[N][N];
    void init()
    {
        for(int i = 0;i < N;i ++)
            for(int j = 0;j <= i;j ++)
                if(!j) c[i][j] = 1;
                else c[i][j] = c[i-1][j] + c[i-1][j-1] % mod;
    }

    (2)乘法逆元
    费马小定理 : 假如p是质数，且 gcd(a,p)=1，那么 a^(p−1)≡1 (mod p)
                所以 a∗a^(p−2)≡1 (mod p)
                得出 : a^(p−2)就是 a 的乘法逆元
                乘法逆元 == qpow(x,p−2)
    int fact[N],infact[N]; //阶乘， 阶乘逆元
    fact[0] = infact[0] = 1;
    for(int i = 1; i < N; i ++)
    {
        fact[i] = (LL)fact[i - 1] * i % mod;
        infact[i] = (LL)infact[i - 1] * qmi(i,mod - 2, mod) % mod;
    }

    (3)卢卡斯(Lucas)定理 空间O(MOD) 时间O(logMOD(n))
        C(a,b) = C(a%MOD, b%MOD) * C(a/MOD, b/MOD)
        int MOD;
        int C(int a,int b)
        {
            if(a < b) return 0;

            int up = 1, down = 1;
            for(int i = a,j = 1; j <= b;i --, j ++)
            {
                up = up * i % MOD;
                down = down * j % MOD;
            }
            return up * qmi(down, MOD-2, MOD)%MOD;
        }

        int Lucas(int a,int b)
        {
            if(a < MOD && b < MOD) return C(a,b);
            return C(a%MOD,b%MOD) * Lucas(a/MOD,b/MOD) % MOD;
        }
    (4)高精度计算
        void add(int c[], int a[], int b[]) //c=a+b 高精度加法
        {
            for(int i = 0, t = 0; i < N; i++)
            {
                t += a[i] + b[i];
                c[i] = t % 10;
                t /= 10;
            }
        }
        for(int i = 0; i < n; i++) //上标i
            for(int j = 0; j <= i && j < k; j++) //下标j
                if(!j) f[i][j][0] = 1; //C(i,0) = 1
                else add(f[i][j], f[i-1][j], f[i-1][j-1]); //f[i][j] = f[i-1][j] + f[i-1][j-1];
                //C(i, j) = C(i - 1, j) + C(i - 1, j - 1)
    (5)Calatan    
    将问题转换为 路径问题：0 为向右，1 为向上，走到(n,n) 的位置
    每一个排列对应着一种路径；

    证明思路：任何一条从(0,0)到(n,n)的经过 x > y 这条线的路径都能通过轴对称，变成一条
    从(0,0)到(n+1,n-1)的路径 ，则这两种方案数相等（从第一次相交的点做轴对称）
    结果便是总的方案数 C(2n,n) - C(2n,n-1);

    res = C(2n,n) - C(2n,n-1) = C(2n,n) / n + 1;(利用定义化简) 

* 本题: 高精度求解
    Catalan数推导
    (n,m)关于y=x+1对称的点是(m-1,n+1)
    答案: C(n+m, n) - C(n+m, n+1)
        
*/

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int N = 10010, MOD = 1e6+3;
int n, m;
int primes[N], cnt;
bool st[N];
int a[N], b[N];

void init(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j] * i <= n; j++)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

//返回 x! 中质因子 p 的个数
int get(int x, int p) 
{
    int res = 0;
    while (x) res += x / p, x /= p;
    return res;
}

void mul(int r[], int &len, int p)
{
    int t = 0;
    for(int i = 0; i < len; i++)
    {
        t += r[i] * p;
        r[i] = t % 10;
        t /= 10;
    }

    while(t)//处理进位
    {
        r[len++] = t % 10;
        t /= 10;
    }
}

int C(int x,int y, int r[])
{
    int len = 1;
    r[0] = 1;
    for(int i = 0; i < cnt; i++)
    {
        int p = primes[i];
        int s = get(x, p) - get(y, p) - get(x-y, p); //质因子p的净个数=分子的质因子p的个数-分母的质因子p的个数
        while(s--) mul(r, len, p);
    }
    return len;
}

//高精度减法
void sub(int a[], int a1, int b[], int b1)
{
    for(int i = 0; i < a1; i++)
    {
        a[i] -= b[i];
        if(a[i] < 0)
        {
            a[i] += 10;
            a[i+1]--;
        }
    }
}

signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
    #else
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #endif
    init(N-1);
    int n, m; cin >> n >> m;
    int a1 = C(n+m, n, a);
    int b1 = C(n+m, n+1, b);

    sub(a, a1, b, b1);

    int k = a1-1;
    while(!a[k] && k > 0) k--;
    while(k >= 0) printf("%d", a[k--]);
    return 0;
}
